Circular Reference বলতে বোঝায়, যখন দুটি বা তার চেয়ে বেশি অবজেক্ট একে অপরকে রেফার করে এবং এর ফলে একটি রেফারেন্স চক্র তৈরি হয়। Jackson-এর মতো লাইব্রেরি ব্যবহার করে JSON Serialization বা Deserialization করার সময় Circular Reference সমস্যা দেখা দিতে পারে।
Circular Reference উদাহরণ
উদাহরণ:
public class CircularReferenceExample {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
// Parent এবং Child Object তৈরি
Parent parent = new Parent();
Child child = new Child();
// Circular Reference
parent.setChild(child);
child.setParent(parent);
// JSON Serialization
String json = objectMapper.writeValueAsString(parent);
System.out.println("Serialized JSON: " + json);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Parent {
private String name = "Parent";
private Child child;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
}
class Child {
private String name = "Child";
private Parent parent;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
সমস্যা:
Serialization চলাকালীন Jackson Parent এবং Child এর রেফারেন্স বারবার প্রসেস করতে গিয়ে StackOverflowError সৃষ্টি করবে।
Circular Reference সমস্যার কারণ
- Recursive References:
- Parent একটি Child রেফার করে, এবং সেই Child আবার Parent রেফার করে। এই চক্র চলতেই থাকে।
- Serialization Logic:
- Jackson ডিফল্টভাবে সমস্ত রেফারেন্স JSON-এ রূপান্তর করার চেষ্টা করে, যা একটি অসীম লুপের সৃষ্টি করে।
Circular Reference এর সমাধান
১. @JsonManagedReference এবং @JsonBackReference ব্যবহার
Jackson Circular Reference সমস্যা সমাধানের জন্য @JsonManagedReference এবং @JsonBackReference সরবরাহ করে।
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
class Parent {
private String name = "Parent";
@JsonManagedReference
private Child child;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
}
class Child {
private String name = "Child";
@JsonBackReference
private Parent parent;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
আউটপুট:
{
"name": "Parent",
"child": {
"name": "Child"
}
}
২. @JsonIdentityInfo ব্যবহার
আপনি Circular Reference সমাধানের জন্য @JsonIdentityInfo ব্যবহার করতে পারেন। এটি Object-এর ID ব্যবহার করে রেফারেন্স ট্র্যাক করে।
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
class Parent {
private int id = 1;
private String name = "Parent";
private Child child;
public int getId() {
return id;
}
public Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
class Child {
private int id = 2;
private String name = "Child";
private Parent parent;
public int getId() {
return id;
}
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
আউটপুট:
{
"id": 1,
"name": "Parent",
"child": {
"id": 2,
"name": "Child",
"parent": 1
}
}
৩. Serialization Views ব্যবহার
Serialization Views ব্যবহার করে আপনি নির্দিষ্ট অংশ Serialize করতে পারেন এবং Circular Reference এড়াতে পারেন।
৪. @JsonIgnore ব্যবহার
যদি কোনো ফিল্ড Serialize না করা প্রয়োজন হয়, তাহলে @JsonIgnore ব্যবহার করা যায়।
class Child {
private String name = "Child";
@JsonIgnore
private Parent parent;
// Getters and Setters
}
Circular Reference সমস্যা সমাধানের সেরা পদ্ধতি
- যদি Parent-Child সম্পর্ক থাকে:
@JsonManagedReferenceএবং@JsonBackReference। - যদি Object ID ব্যবহার করতে চান:
@JsonIdentityInfo। - যদি নির্দিষ্ট ফিল্ড বাদ দিতে চান:
@JsonIgnore।
- Circular Reference হল অবজেক্টের একে অপরকে রেফার করার একটি চক্র যা JSON Serialization-এর সময় সমস্যার সৃষ্টি করে।
- Jackson-এর
@JsonManagedReference,@JsonBackReference, এবং@JsonIdentityInfoএর মতো টুল ব্যবহার করে এই সমস্যা সহজেই সমাধান করা যায়। - আপনার প্রয়োজন এবং ডেটা মডেলের উপর ভিত্তি করে সঠিক পদ্ধতি নির্বাচন করুন।
Read more